#include "port.h"




void hc595_write_data(unsigned char data)
{
    unsigned char i = 0;
    for(i=0;i<8;i++)//循环 8 次即可将一个字节写入寄存器中
    {
        HC595_SER = data>>7;//优先传输一个字节中的高位
        data<<=1;//将低位移动到高位
        HC595_SRCLK=0;
        delay_us(10);
        HC595_SRCLK=1;
        delay_us(10);//移位寄存器时钟上升沿将端口数据送入寄存器中
    }
    HC595_RCLK=0;
    delay_us(10);
    HC595_RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}

void hc595_ctrl(void)
{
    unsigned char i=0;
    unsigned char ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    LEDLattice=0x00;//将 LED 点阵列全部设置为 0，即 LED 阴极为低电平
    for(i=0;i<8;i++)
    {
        hc595_write_data(0x00);//消除前面寄存器缓存数据
        hc595_write_data(ghc595_buf[i]);//写入新的数据
        delay_ms(500);//延时 500ms
    }
}

void hc595_one_init(){
    LEDLattice=0x7f;//将 LED 点阵左边第一列设置为 0，即 LED 阴极为低电平，其余列为 1，即高电平
    hc595_write_data(0x00);//消除前面寄存器缓存数据
    hc595_write_data(0x80);
}

void hc595_one_write(){
    // hc595_write_data(0x00);//消除前面寄存器缓存数据
    // hc595_write_data(0x80);//将 LED 点阵上边第一行设置为 1，即 LED 阳极为高电平，其余行为 0，即低电平
    // delay_ms(1);//延时 500ms
}

void hc595_write_one(){
    // unsigned char gled_row[8]={0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x00};//LED 点阵显示数字 0 的行数据
    unsigned char gled_row[8]={0x00,0x00,0x80,0x82,0xFE,0x80,0x80,0x00};
    // unsigned char gled_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED 点阵显示数字 0 的列数据
    // unsigned char gled_col[8]={0x7f,0x3f,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED 点阵显示数字 0 的列数据
    unsigned char gled_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
    unsigned char i=0;
    for(i=0;i<8;i++)//循环 8 次扫描 8 行、列
    {
        LEDLattice=gled_col[i];//传送列选数据
        // hc595_write_data(0x00);//消影
        hc595_write_data(gled_row[i]);//传送行选数据
        delay_ms(100);//延时一段时间，等待显示稳定
        hc595_write_data(0x00);//消影
        // LEDLattice=0xFF;//传送列选数据
    }
}